تحديد مدخلات و مخرجات الاردوينو و برنامج التحكم باللمس
درس يشرح كيفية تحديد مدخلات و مخرجات (Inputs & Outputs) الآردوينو مع برنامج التحكم بالضوء عن طريق اللمس.
يحتوي الآردوينو على مجموعة من نقاط الارتباط (Pins) والتي يمكن من خلالها ربط الآردوينو إلى الدوائر الخارجية. يمكن استخدام أي من هذه النقاط كمدخلات أو مخرجات و حسب الحاجة. سنقوم اليوم بشرح المدخلات و المخرجات الثنائية (Digital Input & Digital Output). يمكن أيضاً تعريف نقاط الارتباط في الآردوينو كمدخلات خطية (Analog Inputs) أو يمكن التحكم بمقدار الفولتية الخارجة من نقطة الارتباط عن طريق تحميل عرض النبضة(PWM) لكن سيتم شرحها في موضوع آخر منفصل لاحقاً.
يستخدم الأمر pinMode لتحديد اتجاه نقطة الارتباط سواء كانت نقطة دخول (Input) أو نقطة خروج (Output). كما يمكنك تحديد نقطة الارتباط كمدخل مع مقاومة رفع (PULLUP).
ما هي مقاومة الرفع (PULLUP Resistor) ؟
إن مقاومة الدخول لنقطة ارتباط الآردوينو عالية جدا, لذلك فهي بحاجة إلى تيار قليل جدا لتغيير القيمة المقروءة على المدخل. لذلك فإن قيمة نقطة الربط التي تترك بدون أي ارتباط خارجي أو أن تربط إلى سلك غير مربوط إلى الدائرة ستكون عشوائية وذلك حسب ما يصل إليها من الضوضاء الخارجية كالمجالات الكهرومغناطيسية المنتشرة حوله. تقوم مقاومة الرفع بربط نقطة الربط هذه إلى فولتية المصدر عن طريق مقاومة عادة ما تكون عالية (يحتوي لوح التطوير من آردوينو على مقاومات رفع مدمجة بقيمة 20 كيلو اوم) لتعطيها قيمة افتراضية لإلغاء تأثير الضوضاء على قيمة نقطة الارتباط. ستتعرف اكثر على فائدة هذه المقاومة أثناء تجربة المثال المرفق مع الدرس.
كيفية تحديد اتجاه نقطة الارتباط.
كما ذكرنا سابقاً فإن من الممكن تحديد اتجاه نقطة الارتباط كنقطة دخول أو نقطة خروج عن طريق الأمر pinMode و كما يلي:
- نقطة خروج Output Pin. لتحديد نقطة ارتباط معينة في الآردوينو كنقطة خروج (Output Pin) يجب أن نحدد رقم نقطة الارتباط و نحددها كـ OUTPUT. على سبيل المثال, نحتاج إلى أن نجعل نقطة الارتباط رقم 13 كنقطة خروج فنستخدم الأمر pinMode(13, OUTPUT). أصبحت الآن نقطة الارتباط رقم 13 نقطة خروج و يمكننا تغيير قيمتها عن طريق الأمر digitalWrite لتغيير قيمتها إلى قيمة الفولتية الداخلة VCC بكتابة digitalWrite(13, HIGH) أو إلى قيمة 0 فولت بكتابة digitalWrite(13, LOW).
- نقطة دخول Input Pin بدون مقاومة رفع. قد تكون نقطة الارتباط هذه مربوطة إلى جزء معين من دائرة خارجية و هي ليست بحاجة إلى مقاومة رفع أو انك قد قمت بوضع مقاومة رفع خارجية ذات قيمة محددة حسب احتياج التصميم, فأنت لست بحاجة إلى تشغيل مقاومة الرفع المدمجة داخل الآردوينو. لتحديد نقطة الارتباط رقم 2 كنقطة دخول, نكتب الأمر pinMode(2, INPUT). اصبح الآن بإمكاننا قراءة قيمة نقطة الدخول رقم 2 عن طريق الأمر digitalRead(2) والتي ستكون إما 0 أو 1 وحسب الفولتية المسلطة على نقطة الدخول.
- نقطة دخول Input Pin مع مقاومة رفع. لتفعيل مقاومة الرفع المدمجة مع الآردوينو, يمكنك كتابة الأمر pinMode(2, INPUT_PULLUP).
لنبدأ الآن بكتابة برنامج بسيط يقوم بتشغيل دايود باعث للضوء LED مربوط إلى نقطة الارتباط رقم 13 عند لمس سلك مربوط بنقطة الاتصال رقم 2 و الأرضي. في البداية علينا تحديد نقطة الاتصال رقم 13 في الآردوينو كنقطة خروج فنكتب الأمر pinMode(13, OUTPUT) في الجزء void setup() (لمعرفة المزيد عن بيئة تطوير الآردوينو يمكنك مراجعة درس مباديء برمجة الآردوينو).
سنقوم في البداية بتعريف نقطة الارتباط رقم 2 كنقطة دخول بدون مقاومة رفع لنتعرف إلى طريقة تصرف الآردوينو بدون هذه المقاومة ثم نقوم بربط مقاومة رفع خارجية و في النهاية سنقوم بتفعيل مقاومة الرفع المدمجة و نقارن الاختلافات. إذاً نقوم الآن بكتابة الأمر pinMode(2, INPUT).
اصبح الآن الجزء void setup كالتالي:
void setup() {
pinMode(13,OUTPUT);
pinMode(2,INPUT);
}
لتشغيل الدايود الباعث للضوء LED المربوط إلى نقطة الاتصال رقم 13, يجب أن نقوم بتسليط فولتية على هذه النقطة, لكن تشغيله يعتمد على قراءة قيمة نقطة الارتباط رقم 2. هناك اكثر من طريقة لفعل ذلك, منها أن نقوم بوضع قيمة القراءة المأخوذة من النقطة 2 ثم كتابتها على النقطة 13 أو استخدام الجمل الشرطية, لكننا سنقوم بكتابة أمر بسيط يقوم بكتابة قيمة القراءة على النقطة رقم 2 مباشرة إلى النقطة 13 عن طريق كتابة
digitalWrite(13,digitalRead(2));
ملاحظة: يحتوي لوح تطوير آردوينو على دايود باعث للضوء LED مدمج على اللوح و مربوط إلى نقطة الارتباط 13 ويرمز له بالرمز L. أي يمكنك الاعتماد على هذا الـLED أثناء هذه التجربة دون الحاجة إلى ربط LED خارجي.
لنبدأ الآن بتنفيذ التجربة عمليا لمقارنة النتائج.
نقوم بربط الدائرة كما في الشكل التالي:
لاحظ إن احد طرفي متحسس اللمس مربوط إلى الأرضي, أي أن الـ LED سوف يطفأ عند لمس المتحسس. يمكنك تغيير ذلك بتغيير الأمر digitalWrite(13,digitalRead(2)); الى digitalWrite(13,!digitalRead(2)); حيث أن العلامة "!" تمثل عكس القيمة Inverse.
لنبدأ الآن بتشغيل البرنامج بدون أي تغييرات. ستلاحظ إن الـ LED سيكون مضيء بضوء خافت. إذا قمت بربط اوسلوسكوب إلى النقطة رقم 13, ستلاحظ أن الفولتية الخارجة منها غير مستقرة. هذا بسبب إن قراءة النقطة رقم 2 غير مستقرة بسبب الضوضاء.
عند الضغط بأصبعك على متحسس اللمس سوف ينطفأ الـLED و ذلك لأن يدك تقوم بربط نقطة الارتباط رقم 2 بالأرضي و لكن برفع يدك سيعود الـLED للإضاءة بضوء خافت و هذا غير مرغوب. للتخلص من هذا, يجب استخدام مقاومة رافعة (Pullup Resistor) تقوم بتوصيل نقطة الارتباط رقم 2 إلى فولتية المصدر ليضيء الـLED بشكل تام و مستقر. قم بربط طرف المقاومة 10M اوم إلى النقطة بين متحسس اللمس و نقطة الارتباط رقم 2 في الآردوينو. ستلاحظ الآن إن الـLED سيبقى مضيء بشكل طبيعي و ينطفيء عند لمسك لمتحسس اللمس.
الآن قم بفصل المقاومة 10M و اربط طرف المقاومة 1M بدلا عنها. ستلاحظ انك بحاجة لتسليط ضغط أعلى على المتحسس لإطفاء الـLED. إن السبب وراء ذلك هو انك بالضغط اكثر فإنك تقلل من المقاومة التي يتسبب بها الجلد على متحسس اللمس و بما إن المقاومة الرافعة أصبحت اقل, فأنت بحاجة إلى مقاومة اقل بكثير من الحالة الأولى للحصول على مستوى منخفض من الفولتية لتغيير قراءة نقطة الارتباط رقم 2 في الآردوينو حسب قانون تقسيم الفولتية (Voltage Divider).
لنقم ألآن بتغيير تعريف نقطة التوصيل رقم 2 إلى pinMode(2, INPUT_PULLUP) و قم بإزالة مقاومة الرفع 1M اوم. ستلاحظ انك لن تتمكن من إطفاء الـLED إلا بتسليط ضغط كبير و قد لن تتمكن مطلقاً من إطفاءه حتى مع الضغط الكبير و ذلك بسبب قلة مقاومة الرفع المدمجة مع الآردوينو و التي تبلغ 20 كيلو اوم كما ذكرنا مسبقا.
يمكنك مشاهدة الفديو التالي للتجربة بكل أجزاءها.